home *** CD-ROM | disk | FTP | other *** search
Text File | 2002-10-03 | 78.7 KB | 2,377 lines |
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- NNNNAAAAMMMMEEEE
- perlcall - Perl calling conventions from C
-
- DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
- The purpose of this document is to show you how to call Perl subroutines
- directly from C, i.e., how to write _c_a_l_l_b_a_c_k_s.
-
- Apart from discussing the C interface provided by Perl for writing
- callbacks the document uses a series of examples to show how the
- interface actually works in practice. In addition some techniques for
- coding callbacks are covered.
-
- Examples where callbacks are necessary include
-
- +o An Error Handler
- You have created an XSUB interface to an application's C API.
-
- A fairly common feature in applications is to allow you to define a
- C function that will be called whenever something nasty occurs. What
- we would like is to be able to specify a Perl subroutine that will
- be called instead.
-
- +o An Event Driven Program
- The classic example of where callbacks are used is when writing an
- event driven program like for an X windows application. In this
- case you register functions to be called whenever specific events
- occur, e.g., a mouse button is pressed, the cursor moves into a
- window or a menu item is selected.
-
- Although the techniques described here are applicable when embedding Perl
- in a C program, this is not the primary goal of this document. There are
- other details that must be considered and are specific to embedding Perl.
- For details on embedding Perl in C refer to the _p_e_r_l_e_m_b_e_d manpage.
-
- Before you launch yourself head first into the rest of this document, it
- would be a good idea to have read the following two documents - the
- _p_e_r_l_x_s manpage and the _p_e_r_l_g_u_t_s manpage.
-
- TTTTHHHHEEEE PPPPEEEERRRRLLLL____CCCCAAAALLLLLLLL FFFFUUUUNNNNCCCCTTTTIIIIOOOONNNNSSSS
- Although this stuff is easier to explain using examples, you first need
- be aware of a few important definitions.
-
- Perl has a number of C functions that allow you to call Perl subroutines.
- They are
-
- I32 perl_call_sv(SV* sv, I32 flags) ;
- I32 perl_call_pv(char *subname, I32 flags) ;
- I32 perl_call_method(char *methname, I32 flags) ;
- I32 perl_call_argv(char *subname, I32 flags, register char **argv) ;
-
- The key function is _p_e_r_l__c_a_l_l__s_v. All the other functions are fairly
- simple wrappers which make it easier to call Perl subroutines in special
-
-
-
- PPPPaaaaggggeeee 1111
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- cases. At the end of the day they will all call _p_e_r_l__c_a_l_l__s_v to invoke
- the Perl subroutine.
-
- All the _p_e_r_l__c_a_l_l_* functions have a flags parameter which is used to
- pass a bit mask of options to Perl. This bit mask operates identically
- for each of the functions. The settings available in the bit mask are
- discussed in the section on _F_L_A_G _V_A_L_U_E_S.
-
- Each of the functions will now be discussed in turn.
-
- perl_call_sv
- _p_e_r_l__c_a_l_l__s_v takes two parameters, the first, sv, is an SV*. This
- allows you to specify the Perl subroutine to be called either as a C
- string (which has first been converted to an SV) or a reference to a
- subroutine. The section, _U_s_i_n_g _p_e_r_l__c_a_l_l__s_v, shows how you can make
- use of _p_e_r_l__c_a_l_l__s_v.
-
- perl_call_pv
- The function, _p_e_r_l__c_a_l_l__p_v, is similar to _p_e_r_l__c_a_l_l__s_v except it
- expects its first parameter to be a C char* which identifies the
- Perl subroutine you want to call, e.g., perl_call_pv("fred", 0). If
- the subroutine you want to call is in another package, just include
- the package name in the string, e.g., "pkg::fred".
-
- perl_call_method
- The function _p_e_r_l__c_a_l_l__m_e_t_h_o_d is used to call a method from a Perl
- class. The parameter methname corresponds to the name of the method
- to be called. Note that the class that the method belongs to is
- passed on the Perl stack rather than in the parameter list. This
- class can be either the name of the class (for a static method) or a
- reference to an object (for a virtual method). See the _p_e_r_l_o_b_j
- manpage for more information on static and virtual methods and the
- section on _U_s_i_n_g _p_e_r_l__c_a_l_l__m_e_t_h_o_d for an example of using
- _p_e_r_l__c_a_l_l__m_e_t_h_o_d.
-
- perl_call_argv
- _p_e_r_l__c_a_l_l__a_r_g_v calls the Perl subroutine specified by the C string
- stored in the subname parameter. It also takes the usual flags
- parameter. The final parameter, argv, consists of a NULL terminated
- list of C strings to be passed as parameters to the Perl subroutine.
- See _U_s_i_n_g _p_e_r_l__c_a_l_l__a_r_g_v.
-
- All the functions return an integer. This is a count of the number of
- items returned by the Perl subroutine. The actual items returned by the
- subroutine are stored on the Perl stack.
-
- As a general rule you should _a_l_w_a_y_s check the return value from these
- functions. Even if you are expecting only a particular number of values
- to be returned from the Perl subroutine, there is nothing to stop someone
- from doing something unexpected - don't say you haven't been warned.
-
-
-
-
-
- PPPPaaaaggggeeee 2222
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- FFFFLLLLAAAAGGGG VVVVAAAALLLLUUUUEEEESSSS
- The flags parameter in all the _p_e_r_l__c_a_l_l_* functions is a bit mask which
- can consist of any combination of the symbols defined below, OR'ed
- together.
-
- GGGG____VVVVOOOOIIIIDDDD
-
- Calls the Perl subroutine in a void context.
-
- This flag has 2 effects:
-
- 1. It indicates to the subroutine being called that it is executing in
- a void context (if it executes _w_a_n_t_a_r_r_a_y the result will be the
- undefined value).
-
- 2. It ensures that nothing is actually returned from the subroutine.
-
- The value returned by the _p_e_r_l__c_a_l_l_* function indicates how many items
- have been returned by the Perl subroutine - in this case it will be 0.
-
- GGGG____SSSSCCCCAAAALLLLAAAARRRR
-
- Calls the Perl subroutine in a scalar context. This is the default
- context flag setting for all the _p_e_r_l__c_a_l_l_* functions.
-
- This flag has 2 effects:
-
- 1. It indicates to the subroutine being called that it is executing in
- a scalar context (if it executes _w_a_n_t_a_r_r_a_y the result will be
- false).
-
- 2. It ensures that only a scalar is actually returned from the
- subroutine. The subroutine can, of course, ignore the _w_a_n_t_a_r_r_a_y
- and return a list anyway. If so, then only the last element of the
- list will be returned.
-
- The value returned by the _p_e_r_l__c_a_l_l_* function indicates how many items
- have been returned by the Perl subroutine - in this case it will be
- either 0 or 1.
-
- If 0, then you have specified the G_DISCARD flag.
-
- If 1, then the item actually returned by the Perl subroutine will be
- stored on the Perl stack - the section _R_e_t_u_r_n_i_n_g _a _S_c_a_l_a_r shows how to
- access this value on the stack. Remember that regardless of how many
- items the Perl subroutine returns, only the last one will be accessible
- from the stack - think of the case where only one value is returned as
- being a list with only one element. Any other items that were returned
- will not exist by the time control returns from the _p_e_r_l__c_a_l_l_* function.
- The section _R_e_t_u_r_n_i_n_g _a _l_i_s_t _i_n _a _s_c_a_l_a_r _c_o_n_t_e_x_t shows an example of this
- behavior.
-
-
-
-
- PPPPaaaaggggeeee 3333
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- GGGG____AAAARRRRRRRRAAAAYYYY
-
- Calls the Perl subroutine in a list context.
-
- As with G_SCALAR, this flag has 2 effects:
-
- 1. It indicates to the subroutine being called that it is executing in
- an array context (if it executes _w_a_n_t_a_r_r_a_y the result will be true).
-
- 2. It ensures that all items returned from the subroutine will be
- accessible when control returns from the _p_e_r_l__c_a_l_l_* function.
-
- The value returned by the _p_e_r_l__c_a_l_l_* function indicates how many items
- have been returned by the Perl subroutine.
-
- If 0, then you have specified the G_DISCARD flag.
-
- If not 0, then it will be a count of the number of items returned by the
- subroutine. These items will be stored on the Perl stack. The section
- _R_e_t_u_r_n_i_n_g _a _l_i_s_t _o_f _v_a_l_u_e_s gives an example of using the G_ARRAY flag and
- the mechanics of accessing the returned items from the Perl stack.
-
- GGGG____DDDDIIIISSSSCCCCAAAARRRRDDDD
-
- By default, the _p_e_r_l__c_a_l_l_* functions place the items returned from by
- the Perl subroutine on the stack. If you are not interested in these
- items, then setting this flag will make Perl get rid of them
- automatically for you. Note that it is still possible to indicate a
- context to the Perl subroutine by using either G_SCALAR or G_ARRAY.
-
- If you do not set this flag then it is _v_e_r_y important that you make sure
- that any temporaries (i.e., parameters passed to the Perl subroutine and
- values returned from the subroutine) are disposed of yourself. The
- section _R_e_t_u_r_n_i_n_g _a _S_c_a_l_a_r gives details of how to dispose of these
- temporaries explicitly and the section _U_s_i_n_g _P_e_r_l _t_o _d_i_s_p_o_s_e _o_f
- _t_e_m_p_o_r_a_r_i_e_s discusses the specific circumstances where you can ignore the
- problem and let Perl deal with it for you.
-
- GGGG____NNNNOOOOAAAARRRRGGGGSSSS
-
- Whenever a Perl subroutine is called using one of the _p_e_r_l__c_a_l_l_*
- functions, it is assumed by default that parameters are to be passed to
- the subroutine. If you are not passing any parameters to the Perl
- subroutine, you can save a bit of time by setting this flag. It has the
- effect of not creating the @_ array for the Perl subroutine.
-
- Although the functionality provided by this flag may seem
- straightforward, it should be used only if there is a good reason to do
- so. The reason for being cautious is that even if you have specified the
- G_NOARGS flag, it is still possible for the Perl subroutine that has been
- called to think that you have passed it parameters.
-
-
-
-
- PPPPaaaaggggeeee 4444
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- In fact, what can happen is that the Perl subroutine you have called can
- access the @_ array from a previous Perl subroutine. This will occur
- when the code that is executing the _p_e_r_l__c_a_l_l_* function has itself been
- called from another Perl subroutine. The code below illustrates this
-
- sub fred
- { print "@_\n" }
-
- sub joe
- { &fred }
-
- &joe(1,2,3) ;
-
- This will print
-
- 1 2 3
-
- What has happened is that fred accesses the @_ array which belongs to
- joe.
-
- GGGG____EEEEVVVVAAAALLLL
-
- It is possible for the Perl subroutine you are calling to terminate
- abnormally, e.g., by calling _d_i_e explicitly or by not actually existing.
- By default, when either of these events occurs, the process will
- terminate immediately. If you want to trap this type of event, specify
- the G_EVAL flag. It will put an _e_v_a_l { } around the subroutine call.
-
- Whenever control returns from the _p_e_r_l__c_a_l_l_* function you need to check
- the $@ variable as you would in a normal Perl script.
-
- The value returned from the _p_e_r_l__c_a_l_l_* function is dependent on what
- other flags have been specified and whether an error has occurred. Here
- are all the different cases that can occur:
-
- +o If the _p_e_r_l__c_a_l_l_* function returns normally, then the value
- returned is as specified in the previous sections.
-
- +o If G_DISCARD is specified, the return value will always be 0.
-
- +o If G_ARRAY is specified _a_n_d an error has occurred, the return value
- will always be 0.
-
- +o If G_SCALAR is specified _a_n_d an error has occurred, the return value
- will be 1 and the value on the top of the stack will be _u_n_d_e_f. This
- means that if you have already detected the error by checking $@ and
- you want the program to continue, you must remember to pop the _u_n_d_e_f
- from the stack.
-
- See _U_s_i_n_g _G__E_V_A_L for details on using G_EVAL.
-
-
-
-
-
- PPPPaaaaggggeeee 5555
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- GGGG____KKKKEEEEEEEEPPPPEEEERRRRRRRR
-
- You may have noticed that using the G_EVAL flag described above will
- aaaallllwwwwaaaayyyyssss clear the $@ variable and set it to a string describing the error
- iff there was an error in the called code. This unqualified resetting of
- $@ can be problematic in the reliable identification of errors using the
- eval {} mechanism, because the possibility exists that perl will call
- other code (end of block processing code, for example) between the time
- the error causes $@ to be set within eval {}, and the subsequent
- statement which checks for the value of $@ gets executed in the user's
- script.
-
- This scenario will mostly be applicable to code that is meant to be
- called from within destructors, asynchronous callbacks, signal handlers,
- __DIE__ or __WARN__ hooks, and tie functions. In such situations, you
- will not want to clear $@ at all, but simply to append any new errors to
- any existing value of $@.
-
- The G_KEEPERR flag is meant to be used in conjunction with G_EVAL in
- _p_e_r_l__c_a_l_l_* functions that are used to implement such code. This flag
- has no effect when G_EVAL is not used.
-
- When G_KEEPERR is used, any errors in the called code will be prefixed
- with the string "\_t(in cleanup)", and appended to the current value of
- $@.
-
- The G_KEEPERR flag was introduced in Perl version 5.002.
-
- See _U_s_i_n_g _G__K_E_E_P_E_R_R for an example of a situation that warrants the use
- of this flag.
-
- DDDDeeeetttteeeerrrrmmmmiiiinnnniiiinnnngggg tttthhhheeee CCCCoooonnnntttteeeexxxxtttt
-
- As mentioned above, you can determine the context of the currently
- executing subroutine in Perl with _w_a_n_t_a_r_r_a_y. The equivalent test can be
- made in C by using the GIMME_V macro, which returns G_ARRAY if you have
- been called in an array context, G_SCALAR if in a scalar context, or
- G_VOID if in a void context (i.e. the return value will not be used). An
- older version of this macro is called GIMME; in a void context it returns
- G_SCALAR instead of G_VOID. An example of using the GIMME_V macro is
- shown in section _U_s_i_n_g _G_I_M_M_E__V.
-
- KKKKNNNNOOOOWWWWNNNN PPPPRRRROOOOBBBBLLLLEEEEMMMMSSSS
- This section outlines all known problems that exist in the _p_e_r_l__c_a_l_l_*
- functions.
-
- 1. If you are intending to make use of both the G_EVAL and G_SCALAR
- flags in your code, use a version of Perl greater than 5.000. There
- is a bug in version 5.000 of Perl which means that the combination
- of these two flags will not work as described in the section _F_L_A_G
- _V_A_L_U_E_S.
-
-
-
-
- PPPPaaaaggggeeee 6666
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- Specifically, if the two flags are used when calling a subroutine
- and that subroutine does not call _d_i_e, the value returned by
- _p_e_r_l__c_a_l_l_* will be wrong.
-
- 2. In Perl 5.000 and 5.001 there is a problem with using _p_e_r_l__c_a_l_l_* if
- the Perl sub you are calling attempts to trap a _d_i_e.
-
- The symptom of this problem is that the called Perl sub will
- continue to completion, but whenever it attempts to pass control
- back to the XSUB, the program will immediately terminate.
-
- For example, say you want to call this Perl sub
-
- sub fred
- {
- eval { die "Fatal Error" ; }
- print "Trapped error: $@\n"
- if $@ ;
- }
-
- via this XSUB
-
- void
- Call_fred()
- CODE:
- PUSHMARK(SP) ;
- perl_call_pv("fred", G_DISCARD|G_NOARGS) ;
- fprintf(stderr, "back in Call_fred\n") ;
-
- When Call_fred is executed it will print
-
- Trapped error: Fatal Error
-
- As control never returns to Call_fred, the "back in Call_fred"
- string will not get printed.
-
- To work around this problem, you can either upgrade to Perl 5.002 or
- higher, or use the G_EVAL flag with _p_e_r_l__c_a_l_l_* as shown below
-
- void
- Call_fred()
- CODE:
- PUSHMARK(SP) ;
- perl_call_pv("fred", G_EVAL|G_DISCARD|G_NOARGS) ;
- fprintf(stderr, "back in Call_fred\n") ;
-
-
- EEEEXXXXAAAAMMMMPPPPLLLLEEEESSSS
- Enough of the definition talk, let's have a few examples.
-
-
-
-
-
-
- PPPPaaaaggggeeee 7777
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- Perl provides many macros to assist in accessing the Perl stack.
- Wherever possible, these macros should always be used when interfacing to
- Perl internals. We hope this should make the code less vulnerable to any
- changes made to Perl in the future.
-
- Another point worth noting is that in the first series of examples I have
- made use of only the _p_e_r_l__c_a_l_l__p_v function. This has been done to keep
- the code simpler and ease you into the topic. Wherever possible, if the
- choice is between using _p_e_r_l__c_a_l_l__p_v and _p_e_r_l__c_a_l_l__s_v, you should always
- try to use _p_e_r_l__c_a_l_l__s_v. See _U_s_i_n_g _p_e_r_l__c_a_l_l__s_v for details.
-
- NNNNoooo PPPPaaaarrrraaaammmmeeeetttteeeerrrrssss,,,, NNNNooootttthhhhiiiinnnngggg rrrreeeettttuuuurrrrnnnneeeedddd
-
- This first trivial example will call a Perl subroutine, _P_r_i_n_t_U_I_D, to
- print out the UID of the process.
-
- sub PrintUID
- {
- print "UID is $<\n" ;
- }
-
- and here is a C function to call it
-
- static void
- call_PrintUID()
- {
- dSP ;
-
- PUSHMARK(SP) ;
- perl_call_pv("PrintUID", G_DISCARD|G_NOARGS) ;
- }
-
- Simple, eh.
-
- A few points to note about this example.
-
- 1. Ignore dSP and PUSHMARK(SP) for now. They will be discussed in the
- next example.
-
- 2. We aren't passing any parameters to _P_r_i_n_t_U_I_D so G_NOARGS can be
- specified.
-
- 3. We aren't interested in anything returned from _P_r_i_n_t_U_I_D, so
- G_DISCARD is specified. Even if _P_r_i_n_t_U_I_D was changed to return some
- _v_a_l_u_e(s), having specified G_DISCARD will mean that they will be
- wiped by the time control returns from _p_e_r_l__c_a_l_l__p_v.
-
- 4. As _p_e_r_l__c_a_l_l__p_v is being used, the Perl subroutine is specified as a
- C string. In this case the subroutine name has been 'hard-wired'
- into the code.
-
-
-
-
-
- PPPPaaaaggggeeee 8888
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- 5. Because we specified G_DISCARD, it is not necessary to check the
- value returned from _p_e_r_l__c_a_l_l__p_v. It will always be 0.
-
- PPPPaaaassssssssiiiinnnngggg PPPPaaaarrrraaaammmmeeeetttteeeerrrrssss
-
- Now let's make a slightly more complex example. This time we want to call
- a Perl subroutine, LeftString, which will take 2 parameters - a string
- ($s) and an integer ($n). The subroutine will simply print the first $n
- characters of the string.
-
- So the Perl subroutine would look like this
-
- sub LeftString
- {
- my($s, $n) = @_ ;
- print substr($s, 0, $n), "\n" ;
- }
-
- The C function required to call _L_e_f_t_S_t_r_i_n_g would look like this.
-
- static void
- call_LeftString(a, b)
- char * a ;
- int b ;
- {
- dSP ;
-
- ENTER ;
- SAVETMPS ;
-
- PUSHMARK(SP) ;
- XPUSHs(sv_2mortal(newSVpv(a, 0)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK ;
-
- perl_call_pv("LeftString", G_DISCARD);
-
- FREETMPS ;
- LEAVE ;
- }
-
- Here are a few notes on the C function _c_a_l_l__L_e_f_t_S_t_r_i_n_g.
-
- 1. Parameters are passed to the Perl subroutine using the Perl stack.
- This is the purpose of the code beginning with the line dSP and
- ending with the line PUTBACK. The dSP declares a local copy of the
- stack pointer. This local copy should aaaallllwwwwaaaayyyyssss be accessed as SP.
-
- 2. If you are going to put something onto the Perl stack, you need to
- know where to put it. This is the purpose of the macro dSP - it
- declares and initializes a _l_o_c_a_l copy of the Perl stack pointer.
-
-
-
-
- PPPPaaaaggggeeee 9999
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- All the other macros which will be used in this example require you
- to have used this macro.
-
- The exception to this rule is if you are calling a Perl subroutine
- directly from an XSUB function. In this case it is not necessary to
- use the dSP macro explicitly - it will be declared for you
- automatically.
-
- 3. Any parameters to be pushed onto the stack should be bracketed by
- the PUSHMARK and PUTBACK macros. The purpose of these two macros,
- in this context, is to count the number of parameters you are
- pushing automatically. Then whenever Perl is creating the @_ array
- for the subroutine, it knows how big to make it.
-
- The PUSHMARK macro tells Perl to make a mental note of the current
- stack pointer. Even if you aren't passing any parameters (like the
- example shown in the section _N_o _P_a_r_a_m_e_t_e_r_s, _N_o_t_h_i_n_g _r_e_t_u_r_n_e_d) you
- must still call the PUSHMARK macro before you can call any of the
- _p_e_r_l__c_a_l_l_* functions - Perl still needs to know that there are no
- parameters.
-
- The PUTBACK macro sets the global copy of the stack pointer to be
- the same as our local copy. If we didn't do this _p_e_r_l__c_a_l_l__p_v
- wouldn't know where the two parameters we pushed were - remember
- that up to now all the stack pointer manipulation we have done is
- with our local copy, _n_o_t the global copy.
-
- 4. The only flag specified this time is G_DISCARD. Because we are
- passing 2 parameters to the Perl subroutine this time, we have not
- specified G_NOARGS.
-
- 5. Next, we come to XPUSHs. This is where the parameters actually get
- pushed onto the stack. In this case we are pushing a string and an
- integer.
-
- See the section on _X_S_U_B_s _a_n_d _t_h_e _A_r_g_u_m_e_n_t _S_t_a_c_k in the _p_e_r_l_g_u_t_s
- manpage for details on how the XPUSH macros work.
-
- 6. Because we created temporary values (by means of _s_v__2_m_o_r_t_a_l() calls)
- we will have to tidy up the Perl stack and dispose of mortal SVs.
-
- This is the purpose of
-
- ENTER ;
- SAVETMPS ;
-
- at the start of the function, and
-
- FREETMPS ;
- LEAVE ;
-
- at the end. The ENTER/SAVETMPS pair creates a boundary for any
-
-
-
- PPPPaaaaggggeeee 11110000
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- temporaries we create. This means that the temporaries we get rid
- of will be limited to those which were created after these calls.
-
- The FREETMPS/LEAVE pair will get rid of any values returned by the
- Perl subroutine (see next example), plus it will also dump the
- mortal SVs we have created. Having ENTER/SAVETMPS at the beginning
- of the code makes sure that no other mortals are destroyed.
-
- Think of these macros as working a bit like using { and } in Perl to
- limit the scope of local variables.
-
- See the section _U_s_i_n_g _P_e_r_l _t_o _d_i_s_p_o_s_e _o_f _t_e_m_p_o_r_a_r_i_e_s for details of
- an alternative to using these macros.
-
- 7. Finally, _L_e_f_t_S_t_r_i_n_g can now be called via the _p_e_r_l__c_a_l_l__p_v function.
-
- RRRReeeettttuuuurrrrnnnniiiinnnngggg aaaa SSSSccccaaaallllaaaarrrr
-
- Now for an example of dealing with the items returned from a Perl
- subroutine.
-
- Here is a Perl subroutine, _A_d_d_e_r, that takes 2 integer parameters and
- simply returns their sum.
-
- sub Adder
- {
- my($a, $b) = @_ ;
- $a + $b ;
- }
-
- Because we are now concerned with the return value from _A_d_d_e_r, the C
- function required to call it is now a bit more complex.
-
- static void
- call_Adder(a, b)
- int a ;
- int b ;
- {
- dSP ;
- int count ;
-
- ENTER ;
- SAVETMPS;
-
- PUSHMARK(SP) ;
- XPUSHs(sv_2mortal(newSViv(a)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK ;
-
- count = perl_call_pv("Adder", G_SCALAR);
-
- SPAGAIN ;
-
-
-
- PPPPaaaaggggeeee 11111111
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- if (count != 1)
- croak("Big trouble\n") ;
-
- printf ("The sum of %d and %d is %d\n", a, b, POPi) ;
-
- PUTBACK ;
- FREETMPS ;
- LEAVE ;
- }
-
- Points to note this time are
-
- 1. The only flag specified this time was G_SCALAR. That means the @_
- array will be created and that the value returned by _A_d_d_e_r will
- still exist after the call to _p_e_r_l__c_a_l_l__p_v.
-
- 2. The purpose of the macro SPAGAIN is to refresh the local copy of the
- stack pointer. This is necessary because it is possible that the
- memory allocated to the Perl stack has been reallocated whilst in
- the _p_e_r_l__c_a_l_l__p_v call.
-
- If you are making use of the Perl stack pointer in your code you
- must always refresh the local copy using SPAGAIN whenever you make
- use of the _p_e_r_l__c_a_l_l_* functions or any other Perl internal
- function.
-
- 3. Although only a single value was expected to be returned from _A_d_d_e_r,
- it is still good practice to check the return code from _p_e_r_l__c_a_l_l__p_v
- anyway.
-
- Expecting a single value is not quite the same as knowing that there
- will be one. If someone modified _A_d_d_e_r to return a list and we
- didn't check for that possibility and take appropriate action the
- Perl stack would end up in an inconsistent state. That is something
- you _r_e_a_l_l_y don't want to happen ever.
-
- 4. The POPi macro is used here to pop the return value from the stack.
- In this case we wanted an integer, so POPi was used.
-
- Here is the complete list of POP macros available, along with the
- types they return.
-
- POPs SV
- POPp pointer
- POPn double
- POPi integer
- POPl long
-
-
- 5. The final PUTBACK is used to leave the Perl stack in a consistent
- state before exiting the function. This is necessary because when
- we popped the return value from the stack with POPi it updated only
-
-
-
- PPPPaaaaggggeeee 11112222
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- our local copy of the stack pointer. Remember, PUTBACK sets the
- global stack pointer to be the same as our local copy.
-
- RRRReeeettttuuuurrrrnnnniiiinnnngggg aaaa lllliiiisssstttt ooooffff vvvvaaaalllluuuueeeessss
-
- Now, let's extend the previous example to return both the sum of the
- parameters and the difference.
-
- Here is the Perl subroutine
-
- sub AddSubtract
- {
- my($a, $b) = @_ ;
- ($a+$b, $a-$b) ;
- }
-
- and this is the C function
-
- static void
- call_AddSubtract(a, b)
- int a ;
- int b ;
- {
- dSP ;
- int count ;
-
- ENTER ;
- SAVETMPS;
-
- PUSHMARK(SP) ;
- XPUSHs(sv_2mortal(newSViv(a)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK ;
-
- count = perl_call_pv("AddSubtract", G_ARRAY);
-
- SPAGAIN ;
-
- if (count != 2)
- croak("Big trouble\n") ;
-
- printf ("%d - %d = %d\n", a, b, POPi) ;
- printf ("%d + %d = %d\n", a, b, POPi) ;
-
- PUTBACK ;
- FREETMPS ;
- LEAVE ;
- }
-
- If _c_a_l_l__A_d_d_S_u_b_t_r_a_c_t is called like this
-
-
-
-
-
- PPPPaaaaggggeeee 11113333
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- call_AddSubtract(7, 4) ;
-
- then here is the output
-
- 7 - 4 = 3
- 7 + 4 = 11
-
- Notes
-
- 1. We wanted array context, so G_ARRAY was used.
-
- 2. Not surprisingly POPi is used twice this time because we were
- retrieving 2 values from the stack. The important thing to note is
- that when using the POP* macros they come off the stack in _r_e_v_e_r_s_e
- order.
-
- RRRReeeettttuuuurrrrnnnniiiinnnngggg aaaa lllliiiisssstttt iiiinnnn aaaa ssssccccaaaallllaaaarrrr ccccoooonnnntttteeeexxxxtttt
-
- Say the Perl subroutine in the previous section was called in a scalar
- context, like this
-
- static void
- call_AddSubScalar(a, b)
- int a ;
- int b ;
- {
- dSP ;
- int count ;
- int i ;
-
- ENTER ;
- SAVETMPS;
-
- PUSHMARK(SP) ;
- XPUSHs(sv_2mortal(newSViv(a)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK ;
-
- count = perl_call_pv("AddSubtract", G_SCALAR);
-
- SPAGAIN ;
-
- printf ("Items Returned = %d\n", count) ;
-
- for (i = 1 ; i <= count ; ++i)
- printf ("Value %d = %d\n", i, POPi) ;
-
- PUTBACK ;
- FREETMPS ;
- LEAVE ;
- }
-
-
-
-
- PPPPaaaaggggeeee 11114444
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- The other modification made is that _c_a_l_l__A_d_d_S_u_b_S_c_a_l_a_r will print the
- number of items returned from the Perl subroutine and their value (for
- simplicity it assumes that they are integer). So if _c_a_l_l__A_d_d_S_u_b_S_c_a_l_a_r is
- called
-
- call_AddSubScalar(7, 4) ;
-
- then the output will be
-
- Items Returned = 1
- Value 1 = 3
-
- In this case the main point to note is that only the last item in the
- list is returned from the subroutine, _A_d_d_S_u_b_t_r_a_c_t actually made it back
- to _c_a_l_l__A_d_d_S_u_b_S_c_a_l_a_r.
-
- RRRReeeettttuuuurrrrnnnniiiinnnngggg DDDDaaaattttaaaa ffffrrrroooommmm PPPPeeeerrrrllll vvvviiiiaaaa tttthhhheeee ppppaaaarrrraaaammmmeeeetttteeeerrrr lllliiiisssstttt
-
- It is also possible to return values directly via the parameter list -
- whether it is actually desirable to do it is another matter entirely.
-
- The Perl subroutine, _I_n_c, below takes 2 parameters and increments each
- directly.
-
- sub Inc
- {
- ++ $_[0] ;
- ++ $_[1] ;
- }
-
- and here is a C function to call it.
-
- static void
- call_Inc(a, b)
- int a ;
- int b ;
- {
- dSP ;
- int count ;
- SV * sva ;
- SV * svb ;
-
- ENTER ;
- SAVETMPS;
-
- sva = sv_2mortal(newSViv(a)) ;
- svb = sv_2mortal(newSViv(b)) ;
-
- PUSHMARK(SP) ;
- XPUSHs(sva);
- XPUSHs(svb);
- PUTBACK ;
-
-
-
- PPPPaaaaggggeeee 11115555
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- count = perl_call_pv("Inc", G_DISCARD);
-
- if (count != 0)
- croak ("call_Inc: expected 0 values from 'Inc', got %d\n",
- count) ;
-
- printf ("%d + 1 = %d\n", a, SvIV(sva)) ;
- printf ("%d + 1 = %d\n", b, SvIV(svb)) ;
-
- FREETMPS ;
- LEAVE ;
- }
-
- To be able to access the two parameters that were pushed onto the stack
- after they return from _p_e_r_l__c_a_l_l__p_v it is necessary to make a note of
- their addresses - thus the two variables sva and svb.
-
- The reason this is necessary is that the area of the Perl stack which
- held them will very likely have been overwritten by something else by the
- time control returns from _p_e_r_l__c_a_l_l__p_v.
-
- UUUUssssiiiinnnngggg GGGG____EEEEVVVVAAAALLLL
-
- Now an example using G_EVAL. Below is a Perl subroutine which computes
- the difference of its 2 parameters. If this would result in a negative
- result, the subroutine calls _d_i_e.
-
- sub Subtract
- {
- my ($a, $b) = @_ ;
-
- die "death can be fatal\n" if $a < $b ;
-
- $a - $b ;
- }
-
- and some C to call it
-
- static void
- call_Subtract(a, b)
- int a ;
- int b ;
- {
- dSP ;
- int count ;
-
- ENTER ;
- SAVETMPS;
-
-
-
-
-
-
-
- PPPPaaaaggggeeee 11116666
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- PUSHMARK(SP) ;
- XPUSHs(sv_2mortal(newSViv(a)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK ;
-
- count = perl_call_pv("Subtract", G_EVAL|G_SCALAR);
-
- SPAGAIN ;
-
- /* Check the eval first */
- if (SvTRUE(ERRSV))
- {
- printf ("Uh oh - %s\n", SvPV(ERRSV, PL_na)) ;
- POPs ;
- }
- else
- {
- if (count != 1)
- croak("call_Subtract: wanted 1 value from 'Subtract', got %d\n",
- count) ;
-
- printf ("%d - %d = %d\n", a, b, POPi) ;
- }
-
- PUTBACK ;
- FREETMPS ;
- LEAVE ;
- }
-
- If _c_a_l_l__S_u_b_t_r_a_c_t is called thus
-
- call_Subtract(4, 5)
-
- the following will be printed
-
- Uh oh - death can be fatal
-
- Notes
-
- 1. We want to be able to catch the _d_i_e so we have used the G_EVAL flag.
- Not specifying this flag would mean that the program would terminate
- immediately at the _d_i_e statement in the subroutine _S_u_b_t_r_a_c_t.
-
- 2. The code
-
- if (SvTRUE(ERRSV))
- {
- printf ("Uh oh - %s\n", SvPV(ERRSV, PL_na)) ;
- POPs ;
- }
-
- is the direct equivalent of this bit of Perl
-
-
-
- PPPPaaaaggggeeee 11117777
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- print "Uh oh - $@\n" if $@ ;
-
- PL_errgv is a perl global of type GV * that points to the symbol
- table entry containing the error. ERRSV therefore refers to the C
- equivalent of $@.
-
- 3. Note that the stack is popped using POPs in the block where
- SvTRUE(ERRSV) is true. This is necessary because whenever a
- _p_e_r_l__c_a_l_l_* function invoked with G_EVAL|G_SCALAR returns an error,
- the top of the stack holds the value _u_n_d_e_f. Because we want the
- program to continue after detecting this error, it is essential that
- the stack is tidied up by removing the _u_n_d_e_f.
-
- UUUUssssiiiinnnngggg GGGG____KKKKEEEEEEEEPPPPEEEERRRRRRRR
-
- Consider this rather facetious example, where we have used an XS version
- of the call_Subtract example above inside a destructor:
-
- package Foo;
- sub new { bless {}, $_[0] }
- sub Subtract {
- my($a,$b) = @_;
- die "death can be fatal" if $a < $b ;
- $a - $b;
- }
- sub DESTROY { call_Subtract(5, 4); }
- sub foo { die "foo dies"; }
-
- package main;
- eval { Foo->new->foo };
- print "Saw: $@" if $@; # should be, but isn't
-
- This example will fail to recognize that an error occurred inside the
- eval {}. Here's why: the call_Subtract code got executed while perl was
- cleaning up temporaries when exiting the eval block, and because
- call_Subtract is implemented with _p_e_r_l__c_a_l_l__p_v using the G_EVAL flag, it
- promptly reset $@. This results in the failure of the outermost test for
- $@, and thereby the failure of the error trap.
-
- Appending the G_KEEPERR flag, so that the _p_e_r_l__c_a_l_l__p_v call in
- call_Subtract reads:
-
- count = perl_call_pv("Subtract", G_EVAL|G_SCALAR|G_KEEPERR);
-
- will preserve the error and restore reliable error handling.
-
- UUUUssssiiiinnnngggg ppppeeeerrrrllll____ccccaaaallllllll____ssssvvvv
-
- In all the previous examples I have 'hard-wired' the name of the Perl
- subroutine to be called from C. Most of the time though, it is more
- convenient to be able to specify the name of the Perl subroutine from
- within the Perl script.
-
-
-
- PPPPaaaaggggeeee 11118888
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- Consider the Perl code below
-
- sub fred
- {
- print "Hello there\n" ;
- }
-
- CallSubPV("fred") ;
-
- Here is a snippet of XSUB which defines _C_a_l_l_S_u_b_P_V.
-
- void
- CallSubPV(name)
- char * name
- CODE:
- PUSHMARK(SP) ;
- perl_call_pv(name, G_DISCARD|G_NOARGS) ;
-
- That is fine as far as it goes. The thing is, the Perl subroutine can be
- specified as only a string. For Perl 4 this was adequate, but Perl 5
- allows references to subroutines and anonymous subroutines. This is
- where _p_e_r_l__c_a_l_l__s_v is useful.
-
- The code below for _C_a_l_l_S_u_b_S_V is identical to _C_a_l_l_S_u_b_P_V except that the
- name parameter is now defined as an SV* and we use _p_e_r_l__c_a_l_l__s_v instead
- of _p_e_r_l__c_a_l_l__p_v.
-
- void
- CallSubSV(name)
- SV * name
- CODE:
- PUSHMARK(SP) ;
- perl_call_sv(name, G_DISCARD|G_NOARGS) ;
-
- Because we are using an SV to call _f_r_e_d the following can all be used
-
- CallSubSV("fred") ;
- CallSubSV(\&fred) ;
- $ref = \&fred ;
- CallSubSV($ref) ;
- CallSubSV( sub { print "Hello there\n" } ) ;
-
- As you can see, _p_e_r_l__c_a_l_l__s_v gives you much greater flexibility in how
- you can specify the Perl subroutine.
-
- You should note that if it is necessary to store the SV (name in the
- example above) which corresponds to the Perl subroutine so that it can be
- used later in the program, it not enough just to store a copy of the
- pointer to the SV. Say the code above had been like this
-
-
-
-
-
-
- PPPPaaaaggggeeee 11119999
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- static SV * rememberSub ;
-
- void
- SaveSub1(name)
- SV * name
- CODE:
- rememberSub = name ;
-
- void
- CallSavedSub1()
- CODE:
- PUSHMARK(SP) ;
- perl_call_sv(rememberSub, G_DISCARD|G_NOARGS) ;
-
- The reason this is wrong is that by the time you come to use the pointer
- rememberSub in CallSavedSub1, it may or may not still refer to the Perl
- subroutine that was recorded in SaveSub1. This is particularly true for
- these cases
-
- SaveSub1(\&fred) ;
- CallSavedSub1() ;
-
- SaveSub1( sub { print "Hello there\n" } ) ;
- CallSavedSub1() ;
-
- By the time each of the SaveSub1 statements above have been executed, the
- SV*s which corresponded to the parameters will no longer exist. Expect
- an error message from Perl of the form
-
- Can't use an undefined value as a subroutine reference at ...
-
- for each of the CallSavedSub1 lines.
-
- Similarly, with this code
-
- $ref = \&fred ;
- SaveSub1($ref) ;
- $ref = 47 ;
- CallSavedSub1() ;
-
- you can expect one of these messages (which you actually get is dependent
- on the version of Perl you are using)
-
- Not a CODE reference at ...
- Undefined subroutine &main::47 called ...
-
- The variable $ref may have referred to the subroutine fred whenever the
- call to SaveSub1 was made but by the time CallSavedSub1 gets called it
- now holds the number 47. Because we saved only a pointer to the original
- SV in SaveSub1, any changes to $ref will be tracked by the pointer
- rememberSub. This means that whenever CallSavedSub1 gets called, it will
- attempt to execute the code which is referenced by the SV* rememberSub.
-
-
-
- PPPPaaaaggggeeee 22220000
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- In this case though, it now refers to the integer 47, so expect Perl to
- complain loudly.
-
- A similar but more subtle problem is illustrated with this code
-
- $ref = \&fred ;
- SaveSub1($ref) ;
- $ref = \&joe ;
- CallSavedSub1() ;
-
- This time whenever CallSavedSub1 get called it will execute the Perl
- subroutine joe (assuming it exists) rather than fred as was originally
- requested in the call to SaveSub1.
-
- To get around these problems it is necessary to take a full copy of the
- SV. The code below shows SaveSub2 modified to do that
-
- static SV * keepSub = (SV*)NULL ;
-
- void
- SaveSub2(name)
- SV * name
- CODE:
- /* Take a copy of the callback */
- if (keepSub == (SV*)NULL)
- /* First time, so create a new SV */
- keepSub = newSVsv(name) ;
- else
- /* Been here before, so overwrite */
- SvSetSV(keepSub, name) ;
-
- void
- CallSavedSub2()
- CODE:
- PUSHMARK(SP) ;
- perl_call_sv(keepSub, G_DISCARD|G_NOARGS) ;
-
- To avoid creating a new SV every time SaveSub2 is called, the function
- first checks to see if it has been called before. If not, then space for
- a new SV is allocated and the reference to the Perl subroutine, name is
- copied to the variable keepSub in one operation using newSVsv.
- Thereafter, whenever SaveSub2 is called the existing SV, keepSub, is
- overwritten with the new value using SvSetSV.
-
- UUUUssssiiiinnnngggg ppppeeeerrrrllll____ccccaaaallllllll____aaaarrrrggggvvvv
-
- Here is a Perl subroutine which prints whatever parameters are passed to
- it.
-
- sub PrintList
- {
- my(@list) = @_ ;
-
-
-
- PPPPaaaaggggeeee 22221111
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- foreach (@list) { print "$_\n" }
- }
-
- and here is an example of _p_e_r_l__c_a_l_l__a_r_g_v which will call _P_r_i_n_t_L_i_s_t.
-
- static char * words[] = {"alpha", "beta", "gamma", "delta", NULL} ;
-
- static void
- call_PrintList()
- {
- dSP ;
-
- perl_call_argv("PrintList", G_DISCARD, words) ;
- }
-
- Note that it is not necessary to call PUSHMARK in this instance. This is
- because _p_e_r_l__c_a_l_l__a_r_g_v will do it for you.
-
- UUUUssssiiiinnnngggg ppppeeeerrrrllll____ccccaaaallllllll____mmmmeeeetttthhhhoooodddd
-
- Consider the following Perl code
-
- {
- package Mine ;
-
- sub new
- {
- my($type) = shift ;
- bless [@_]
- }
-
- sub Display
- {
- my ($self, $index) = @_ ;
- print "$index: $$self[$index]\n" ;
- }
-
- sub PrintID
- {
- my($class) = @_ ;
- print "This is Class $class version 1.0\n" ;
- }
- }
-
- It implements just a very simple class to manage an array. Apart from
- the constructor, new, it declares methods, one static and one virtual.
- The static method, PrintID, prints out simply the class name and a
- version number. The virtual method, Display, prints out a single element
- of the array. Here is an all Perl example of using it.
-
-
-
-
-
-
- PPPPaaaaggggeeee 22222222
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- $a = new Mine ('red', 'green', 'blue') ;
- $a->Display(1) ;
- PrintID Mine;
-
- will print
-
- 1: green
- This is Class Mine version 1.0
-
- Calling a Perl method from C is fairly straightforward. The following
- things are required
-
- +o a reference to the object for a virtual method or the name of the
- class for a static method.
-
- +o the name of the method.
-
- +o any other parameters specific to the method.
-
- Here is a simple XSUB which illustrates the mechanics of calling both the
- PrintID and Display methods from C.
-
- void
- call_Method(ref, method, index)
- SV * ref
- char * method
- int index
- CODE:
- PUSHMARK(SP);
- XPUSHs(ref);
- XPUSHs(sv_2mortal(newSViv(index))) ;
- PUTBACK;
-
- perl_call_method(method, G_DISCARD) ;
-
- void
- call_PrintID(class, method)
- char * class
- char * method
- CODE:
- PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpv(class, 0))) ;
- PUTBACK;
-
- perl_call_method(method, G_DISCARD) ;
-
- So the methods PrintID and Display can be invoked like this
-
- $a = new Mine ('red', 'green', 'blue') ;
- call_Method($a, 'Display', 1) ;
- call_PrintID('Mine', 'PrintID') ;
-
-
-
-
- PPPPaaaaggggeeee 22223333
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- The only thing to note is that in both the static and virtual methods,
- the method name is not passed via the stack - it is used as the first
- parameter to _p_e_r_l__c_a_l_l__m_e_t_h_o_d.
-
- UUUUssssiiiinnnngggg GGGGIIIIMMMMMMMMEEEE____VVVV
-
- Here is a trivial XSUB which prints the context in which it is currently
- executing.
-
- void
- PrintContext()
- CODE:
- I32 gimme = GIMME_V;
- if (gimme == G_VOID)
- printf ("Context is Void\n") ;
- else if (gimme == G_SCALAR)
- printf ("Context is Scalar\n") ;
- else
- printf ("Context is Array\n") ;
-
- and here is some Perl to test it
-
- PrintContext ;
- $a = PrintContext ;
- @a = PrintContext ;
-
- The output from that will be
-
- Context is Void
- Context is Scalar
- Context is Array
-
-
- UUUUssssiiiinnnngggg PPPPeeeerrrrllll ttttoooo ddddiiiissssppppoooosssseeee ooooffff tttteeeemmmmppppoooorrrraaaarrrriiiieeeessss
-
- In the examples given to date, any temporaries created in the callback
- (i.e., parameters passed on the stack to the _p_e_r_l__c_a_l_l_* function or
- values returned via the stack) have been freed by one of these methods
-
- +o specifying the G_DISCARD flag with _p_e_r_l__c_a_l_l_*.
-
- +o explicitly disposed of using the ENTER/SAVETMPS - FREETMPS/LEAVE
- pairing.
-
- There is another method which can be used, namely letting Perl do it for
- you automatically whenever it regains control after the callback has
- terminated. This is done by simply not using the
-
-
-
-
-
-
-
-
- PPPPaaaaggggeeee 22224444
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- ENTER ;
- SAVETMPS ;
- ...
- FREETMPS ;
- LEAVE ;
-
- sequence in the callback (and not, of course, specifying the G_DISCARD
- flag).
-
- If you are going to use this method you have to be aware of a possible
- memory leak which can arise under very specific circumstances. To
- explain these circumstances you need to know a bit about the flow of
- control between Perl and the callback routine.
-
- The examples given at the start of the document (an error handler and an
- event driven program) are typical of the two main sorts of flow control
- that you are likely to encounter with callbacks. There is a very
- important distinction between them, so pay attention.
-
- In the first example, an error handler, the flow of control could be as
- follows. You have created an interface to an external library. Control
- can reach the external library like this
-
- perl --> XSUB --> external library
-
- Whilst control is in the library, an error condition occurs. You have
- previously set up a Perl callback to handle this situation, so it will
- get executed. Once the callback has finished, control will drop back to
- Perl again. Here is what the flow of control will be like in that
- situation
-
- perl --> XSUB --> external library
- ...
- error occurs
- ...
- external library --> perl_call --> perl
- |
- perl <-- XSUB <-- external library <-- perl_call <----+
-
- After processing of the error using _p_e_r_l__c_a_l_l_* is completed, control
- reverts back to Perl more or less immediately.
-
- In the diagram, the further right you go the more deeply nested the scope
- is. It is only when control is back with perl on the extreme left of the
- diagram that you will have dropped back to the enclosing scope and any
- temporaries you have left hanging around will be freed.
-
- In the second example, an event driven program, the flow of control will
- be more like this
-
-
-
-
-
-
- PPPPaaaaggggeeee 22225555
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- perl --> XSUB --> event handler
- ...
- event handler --> perl_call --> perl
- |
- event handler <-- perl_call <----+
- ...
- event handler --> perl_call --> perl
- |
- event handler <-- perl_call <----+
- ...
- event handler --> perl_call --> perl
- |
- event handler <-- perl_call <----+
-
- In this case the flow of control can consist of only the repeated
- sequence
-
- event handler --> perl_call --> perl
-
- for practically the complete duration of the program. This means that
- control may _n_e_v_e_r drop back to the surrounding scope in Perl at the
- extreme left.
-
- So what is the big problem? Well, if you are expecting Perl to tidy up
- those temporaries for you, you might be in for a long wait. For Perl to
- dispose of your temporaries, control must drop back to the enclosing
- scope at some stage. In the event driven scenario that may never happen.
- This means that as time goes on, your program will create more and more
- temporaries, none of which will ever be freed. As each of these
- temporaries consumes some memory your program will eventually consume all
- the available memory in your system - kapow!
-
- So here is the bottom line - if you are sure that control will revert
- back to the enclosing Perl scope fairly quickly after the end of your
- callback, then it isn't absolutely necessary to dispose explicitly of any
- temporaries you may have created. Mind you, if you are at all uncertain
- about what to do, it doesn't do any harm to tidy up anyway.
-
- SSSSttttrrrraaaatttteeeeggggiiiieeeessss ffffoooorrrr ssssttttoooorrrriiiinnnngggg CCCCaaaallllllllbbbbaaaacccckkkk CCCCoooonnnntttteeeexxxxtttt IIIInnnnffffoooorrrrmmmmaaaattttiiiioooonnnn
-
- Potentially one of the trickiest problems to overcome when designing a
- callback interface can be figuring out how to store the mapping between
- the C callback function and the Perl equivalent.
-
- To help understand why this can be a real problem first consider how a
- callback is set up in an all C environment. Typically a C API will
- provide a function to register a callback. This will expect a pointer to
- a function as one of its parameters. Below is a call to a hypothetical
- function register_fatal which registers the C function to get called when
- a fatal error occurs.
-
-
-
-
-
- PPPPaaaaggggeeee 22226666
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- register_fatal(cb1) ;
-
- The single parameter cb1 is a pointer to a function, so you must have
- defined cb1 in your code, say something like this
-
- static void
- cb1()
- {
- printf ("Fatal Error\n") ;
- exit(1) ;
- }
-
- Now change that to call a Perl subroutine instead
-
- static SV * callback = (SV*)NULL;
-
- static void
- cb1()
- {
- dSP ;
-
- PUSHMARK(SP) ;
-
- /* Call the Perl sub to process the callback */
- perl_call_sv(callback, G_DISCARD) ;
- }
-
- void
- register_fatal(fn)
- SV * fn
- CODE:
- /* Remember the Perl sub */
- if (callback == (SV*)NULL)
- callback = newSVsv(fn) ;
- else
- SvSetSV(callback, fn) ;
-
- /* register the callback with the external library */
- register_fatal(cb1) ;
-
- where the Perl equivalent of register_fatal and the callback it
- registers, pcb1, might look like this
-
- # Register the sub pcb1
- register_fatal(\&pcb1) ;
-
- sub pcb1
- {
- die "I'm dying...\n" ;
- }
-
- The mapping between the C callback and the Perl equivalent is stored in
-
-
-
- PPPPaaaaggggeeee 22227777
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- the global variable callback.
-
- This will be adequate if you ever need to have only one callback
- registered at any time. An example could be an error handler like the
- code sketched out above. Remember though, repeated calls to
- register_fatal will replace the previously registered callback function
- with the new one.
-
- Say for example you want to interface to a library which allows
- asynchronous file i/o. In this case you may be able to register a
- callback whenever a read operation has completed. To be of any use we
- want to be able to call separate Perl subroutines for each file that is
- opened. As it stands, the error handler example above would not be
- adequate as it allows only a single callback to be defined at any time.
- What we require is a means of storing the mapping between the opened file
- and the Perl subroutine we want to be called for that file.
-
- Say the i/o library has a function asynch_read which associates a C
- function ProcessRead with a file handle fh - this assumes that it has
- also provided some routine to open the file and so obtain the file
- handle.
-
- asynch_read(fh, ProcessRead)
-
- This may expect the C _P_r_o_c_e_s_s_R_e_a_d function of this form
-
- void
- ProcessRead(fh, buffer)
- int fh ;
- char * buffer ;
- {
- ...
- }
-
- To provide a Perl interface to this library we need to be able to map
- between the fh parameter and the Perl subroutine we want called. A hash
- is a convenient mechanism for storing this mapping. The code below shows
- a possible implementation
-
- static HV * Mapping = (HV*)NULL ;
-
- void
- asynch_read(fh, callback)
- int fh
- SV * callback
- CODE:
- /* If the hash doesn't already exist, create it */
- if (Mapping == (HV*)NULL)
- Mapping = newHV() ;
-
- /* Save the fh -> callback mapping */
- hv_store(Mapping, (char*)&fh, sizeof(fh), newSVsv(callback), 0) ;
-
-
-
- PPPPaaaaggggeeee 22228888
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- /* Register with the C Library */
- asynch_read(fh, asynch_read_if) ;
-
- and asynch_read_if could look like this
-
- static void
- asynch_read_if(fh, buffer)
- int fh ;
- char * buffer ;
- {
- dSP ;
- SV ** sv ;
-
- /* Get the callback associated with fh */
- sv = hv_fetch(Mapping, (char*)&fh , sizeof(fh), FALSE) ;
- if (sv == (SV**)NULL)
- croak("Internal error...\n") ;
-
- PUSHMARK(SP) ;
- XPUSHs(sv_2mortal(newSViv(fh))) ;
- XPUSHs(sv_2mortal(newSVpv(buffer, 0))) ;
- PUTBACK ;
-
- /* Call the Perl sub */
- perl_call_sv(*sv, G_DISCARD) ;
- }
-
- For completeness, here is asynch_close. This shows how to remove the
- entry from the hash Mapping.
-
- void
- asynch_close(fh)
- int fh
- CODE:
- /* Remove the entry from the hash */
- (void) hv_delete(Mapping, (char*)&fh, sizeof(fh), G_DISCARD) ;
-
- /* Now call the real asynch_close */
- asynch_close(fh) ;
-
- So the Perl interface would look like this
-
- sub callback1
- {
- my($handle, $buffer) = @_ ;
- }
-
- # Register the Perl callback
- asynch_read($fh, \&callback1) ;
-
- asynch_close($fh) ;
-
-
-
-
- PPPPaaaaggggeeee 22229999
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- The mapping between the C callback and Perl is stored in the global hash
- Mapping this time. Using a hash has the distinct advantage that it allows
- an unlimited number of callbacks to be registered.
-
- What if the interface provided by the C callback doesn't contain a
- parameter which allows the file handle to Perl subroutine mapping? Say
- in the asynchronous i/o package, the callback function gets passed only
- the buffer parameter like this
-
- void
- ProcessRead(buffer)
- char * buffer ;
- {
- ...
- }
-
- Without the file handle there is no straightforward way to map from the C
- callback to the Perl subroutine.
-
- In this case a possible way around this problem is to predefine a series
- of C functions to act as the interface to Perl, thus
-
- #define MAX_CB 3
- #define NULL_HANDLE -1
- typedef void (*FnMap)() ;
-
- struct MapStruct {
- FnMap Function ;
- SV * PerlSub ;
- int Handle ;
- } ;
-
- static void fn1() ;
- static void fn2() ;
- static void fn3() ;
-
- static struct MapStruct Map [MAX_CB] =
- {
- { fn1, NULL, NULL_HANDLE },
- { fn2, NULL, NULL_HANDLE },
- { fn3, NULL, NULL_HANDLE }
- } ;
-
- static void
- Pcb(index, buffer)
- int index ;
- char * buffer ;
- {
- dSP ;
-
-
-
-
-
-
- PPPPaaaaggggeeee 33330000
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- PUSHMARK(SP) ;
- XPUSHs(sv_2mortal(newSVpv(buffer, 0))) ;
- PUTBACK ;
-
- /* Call the Perl sub */
- perl_call_sv(Map[index].PerlSub, G_DISCARD) ;
- }
-
- static void
- fn1(buffer)
- char * buffer ;
- {
- Pcb(0, buffer) ;
- }
-
- static void
- fn2(buffer)
- char * buffer ;
- {
- Pcb(1, buffer) ;
- }
-
- static void
- fn3(buffer)
- char * buffer ;
- {
- Pcb(2, buffer) ;
- }
-
- void
- array_asynch_read(fh, callback)
- int fh
- SV * callback
- CODE:
- int index ;
- int null_index = MAX_CB ;
-
- /* Find the same handle or an empty entry */
- for (index = 0 ; index < MAX_CB ; ++index)
- {
- if (Map[index].Handle == fh)
- break ;
-
- if (Map[index].Handle == NULL_HANDLE)
- null_index = index ;
- }
-
- if (index == MAX_CB && null_index == MAX_CB)
- croak ("Too many callback functions registered\n") ;
-
- if (index == MAX_CB)
- index = null_index ;
-
-
-
- PPPPaaaaggggeeee 33331111
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- /* Save the file handle */
- Map[index].Handle = fh ;
-
- /* Remember the Perl sub */
- if (Map[index].PerlSub == (SV*)NULL)
- Map[index].PerlSub = newSVsv(callback) ;
- else
- SvSetSV(Map[index].PerlSub, callback) ;
-
- asynch_read(fh, Map[index].Function) ;
-
- void
- array_asynch_close(fh)
- int fh
- CODE:
- int index ;
-
- /* Find the file handle */
- for (index = 0; index < MAX_CB ; ++ index)
- if (Map[index].Handle == fh)
- break ;
-
- if (index == MAX_CB)
- croak ("could not close fh %d\n", fh) ;
-
- Map[index].Handle = NULL_HANDLE ;
- SvREFCNT_dec(Map[index].PerlSub) ;
- Map[index].PerlSub = (SV*)NULL ;
-
- asynch_close(fh) ;
-
- In this case the functions fn1, fn2, and fn3 are used to remember the
- Perl subroutine to be called. Each of the functions holds a separate
- hard-wired index which is used in the function Pcb to access the Map
- array and actually call the Perl subroutine.
-
- There are some obvious disadvantages with this technique.
-
- Firstly, the code is considerably more complex than with the previous
- example.
-
- Secondly, there is a hard-wired limit (in this case 3) to the number of
- callbacks that can exist simultaneously. The only way to increase the
- limit is by modifying the code to add more functions and then
- recompiling. None the less, as long as the number of functions is chosen
- with some care, it is still a workable solution and in some cases is the
- only one available.
-
- To summarize, here are a number of possible methods for you to consider
- for storing the mapping between C and the Perl callback
-
-
-
-
-
- PPPPaaaaggggeeee 33332222
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- 1. Ignore the problem - Allow only 1 callback
- For a lot of situations, like interfacing to an error handler, this
- may be a perfectly adequate solution.
-
- 2. Create a sequence of callbacks - hard wired limit
- If it is impossible to tell from the parameters passed back from the
- C callback what the context is, then you may need to create a
- sequence of C callback interface functions, and store pointers to
- each in an array.
-
- 3. Use a parameter to map to the Perl callback
- A hash is an ideal mechanism to store the mapping between C and
- Perl.
-
- AAAAlllltttteeeerrrrnnnnaaaatttteeee SSSSttttaaaacccckkkk MMMMaaaannnniiiippppuuuullllaaaattttiiiioooonnnn
-
- Although I have made use of only the POP* macros to access values
- returned from Perl subroutines, it is also possible to bypass these
- macros and read the stack using the ST macro (See the _p_e_r_l_x_s manpage for
- a full description of the ST macro).
-
- Most of the time the POP* macros should be adequate, the main problem
- with them is that they force you to process the returned values in
- sequence. This may not be the most suitable way to process the values in
- some cases. What we want is to be able to access the stack in a random
- order. The ST macro as used when coding an XSUB is ideal for this
- purpose.
-
- The code below is the example given in the section _R_e_t_u_r_n_i_n_g _a _l_i_s_t _o_f
- _v_a_l_u_e_s recoded to use ST instead of POP*.
-
- static void
- call_AddSubtract2(a, b)
- int a ;
- int b ;
- {
- dSP ;
- I32 ax ;
- int count ;
-
- ENTER ;
- SAVETMPS;
-
- PUSHMARK(SP) ;
- XPUSHs(sv_2mortal(newSViv(a)));
- XPUSHs(sv_2mortal(newSViv(b)));
- PUTBACK ;
-
- count = perl_call_pv("AddSubtract", G_ARRAY);
-
-
-
-
-
-
- PPPPaaaaggggeeee 33333333
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- SPAGAIN ;
- SP -= count ;
- ax = (SP - PL_stack_base) + 1 ;
-
- if (count != 2)
- croak("Big trouble\n") ;
-
- printf ("%d + %d = %d\n", a, b, SvIV(ST(0))) ;
- printf ("%d - %d = %d\n", a, b, SvIV(ST(1))) ;
-
- PUTBACK ;
- FREETMPS ;
- LEAVE ;
- }
-
- Notes
-
- 1. Notice that it was necessary to define the variable ax. This is
- because the ST macro expects it to exist. If we were in an XSUB it
- would not be necessary to define ax as it is already defined for
- you.
-
- 2. The code
-
- SPAGAIN ;
- SP -= count ;
- ax = (SP - PL_stack_base) + 1 ;
-
- sets the stack up so that we can use the ST macro.
-
- 3. Unlike the original coding of this example, the returned values are
- not accessed in reverse order. So ST(0) refers to the first value
- returned by the Perl subroutine and ST(count-1) refers to the last.
-
- CCCCrrrreeeeaaaattttiiiinnnngggg aaaannnndddd ccccaaaalllllllliiiinnnngggg aaaannnn aaaannnnoooonnnnyyyymmmmoooouuuussss ssssuuuubbbbrrrroooouuuuttttiiiinnnneeee iiiinnnn CCCC
-
- As we've already shown, perl_call_sv can be used to invoke an anonymous
- subroutine. However, our example showed how Perl script invoking an XSUB
- to preform this operation. Let's see how it can be done inside our C
- code:
-
- ...
-
- SV *cvrv = perl_eval_pv("sub { print 'You will not find me cluttering any namespace!' }", TRUE);
-
- ...
-
- perl_call_sv(cvrv, G_VOID|G_NOARGS);
-
- perl_eval_pv is used to compile the anonymous subroutine, which will be
- the return value as well (read more about perl_eval_pv in the
- perl_eval_pv entry in the _p_e_r_l_g_u_t_s manpage). Once this code reference is
-
-
-
- PPPPaaaaggggeeee 33334444
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
- in hand, it can be mixed in with all the previous examples we've shown.
-
- SSSSEEEEEEEE AAAALLLLSSSSOOOO
- the _p_e_r_l_x_s manpage, the _p_e_r_l_g_u_t_s manpage, the _p_e_r_l_e_m_b_e_d manpage
-
- AAAAUUUUTTTTHHHHOOOORRRR
- Paul Marquess <_p_m_a_r_q_u_e_s_s@_b_f_s_e_c._b_t._c_o._u_k>
-
- Special thanks to the following people who assisted in the creation of
- the document.
-
- Jeff Okamoto, Tim Bunce, Nick Gianniotis, Steve Kelem, Gurusamy Sarathy
- and Larry Wall.
-
- DDDDAAAATTTTEEEE
- Version 1.3, 14th Apr 1997
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PPPPaaaaggggeeee 33335555
-
-
-
-
-
-
- PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111)))) PPPPEEEERRRRLLLLCCCCAAAALLLLLLLL((((1111))))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PPPPaaaaggggeeee 33336666
-
-
-
-
-
-
-